【X68000(Z)アセンブラ講座 第003回 : 前回の続き[ スタック ]】 2024/12/12   こんにちは!! 急に冬の寒さが激しくなって辛い季節になりましたが、皆さんお元気ですか? 僕はX68000Zをいろいろ弄ったりプログラミングに打ち込んだり サウンドドライバーZ-MUSICで音作りをしたりでホットな毎日です☆ この講座でアセンブラ開発の勉強をしている皆さんもホットになれるように 講座の内容も「解りやすさ」を目標にして進めていきます!! 一応確認ですが、 僕の講座はゲームプログラミングにターゲットを決めており、 他のジャンルのプログラムの知識や専門用語を持ち込まずに ゲーム好きの誰もが気楽に済む事を高望みしています(笑) 今回は以前「次回以降の講座で説明する」と約束した「スタック」について解説していきます。 ネット上でも約束した事に関してはできる限り行動して信用のある人格を得たいですからね(^^) それでは始まります!! [ スタックとSP ] 680x0MPUにはd0〜d7とa0〜a7の16本のメインのレジスターがあり そのうちa7は別名SPと特別な機能が備わっています。 SPはStack Pointerの略名でスタックと呼ばれるメモリーにアクセスできます。 スタックは計算中にレジスタが足りなくなった時などに 一時的に使っていないレジスターの中身をスタックに退避しておいて そのレジスターを計算に使う時や、 OSコールの際に必要なパラメーターを受け渡す時などに使います。 (個人的に自作ルーチンを作る時はパラメーターの受け渡しが速いレジスターを使うので 自作ルーチンのパラメーターで遅いスタックを使った事はありませんw) (例) 68000MPUプログラム movem.l d0/a1,-(SP) * d0とa1をスタックに退避する moveq.l #_B_SUPER,d0 * d0にIOCS(BIOS)の機能番号を代入 movea.l #0,a1 * a1に0を入れるとスーパーバイザー(システム)モードへ変更 trap #15 * IOCSコール実行 movem.l (SP)+,d0/a1 * スタックに退避したd0とa1を元の値に戻す SPにはSSP(システムSP)とUSP(ユーザーSP)の2つがありモード毎に割り当てられている。 快適な速度のゲームプログラムを作りたいのなら ゲーム起動時にすぐスーパーバイザーモードに移行して プログラム終わりまでモードの切り替えを行わないようにする事をお薦めしますし、 その方がSSPとUSPを意識せずに済みます。 今回は重要な役割を果たすスタックに関して説明しましたが、 ゲームプログラムを組む事に限定していますので短くまとまりました(^^; 皆さん、お疲れ様でした!! P.S. 次回予告をしておきます。 Windowsでよく扱われているBMP形式の画像を X68000Zのコマンドプロンプト画面モードの壁紙として表示するプログラムを組みます。 いよいよ実践編です♪ 壁紙は皆さんそれぞれお気に入りの画像を使いたいと思っていると思いますので その画像を768×512ピクセルに合わせてサイズ調整して 色数は16色(4ビットカラーモード)に減色したBMP画像ファイルを用意して下さい☆ その際に画像を上下反転して画像保存して下さい。 (保存される時にBMP画像の中身は上下逆なので) 一応画像を用意できない方のためにこちらでも壁紙をいくつか用意しますけどね。 [EOF]